Return to previous page

This file contains statistics and figures from the paper, “Molecular, Cellular, and Developmental Organization of the Mouse Vomeronasal organ at Single Cell Resolution” by Max Hills Jr., Limei Ma, Ai Fang, Thelma Chiremba, Seth Malloy, Allison Scott, Anoja Perera, and C. Ron Yu.

The paper can be found here:

Molecular, Cellular, and Developmental Organization of the Mouse Vomeronasal organ at Single Cell Resolution



Co-expression of chemosensory receptors

Shannon Indices showing the specificity of receptor expression. High values indicate more co-expression

Prevalence and level of receptor co-expression by age and cell-type for the V1R and V2R lineages, respectively

V1R

V2R

Circos plot of genomic loci for significantly co-expressed receptor pairs in the V1R, V2R, and across-type populations

V1R Co-expression

V2R Co-expression

Interclass Co-expression

LS0tCnRpdGxlOiAiVk5PIEF0bGFzIEZpZ3VyZSA1IgphdXRob3I6ICJNYXggSGlsbHMiCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjc3M6IHN0eWxlLmNzcwotLS0KCioqUmV0dXJuIHRvIHByZXZpb3VzIHBhZ2UqKiAgCmBgYHtyLCByZXN1bHRzPSdhc2lzJ30KCmNhdCgiPGJ1dHRvbiBvbmNsaWNrPSdoaXN0b3J5LmJhY2soKSc+QmFjazwvYnV0dG9uPiIpCgpgYGAKICAKPlRoaXMgZmlsZSBjb250YWlucyBzdGF0aXN0aWNzIGFuZCBmaWd1cmVzIGZyb20gdGhlIHBhcGVyLCAiTW9sZWN1bGFyLCBDZWxsdWxhciwgYW5kIERldmVsb3BtZW50YWwgT3JnYW5pemF0aW9uIG9mIHRoZSBNb3VzZSBWb21lcm9uYXNhbCBvcmdhbiBhdCBTaW5nbGUgQ2VsbCBSZXNvbHV0aW9uIiBieSBNYXggSGlsbHMgSnIuLCBMaW1laSBNYSwgQWkgRmFuZywgVGhlbG1hIENoaXJlbWJhLCBTZXRoIE1hbGxveSwgQWxsaXNvbiBTY290dCwgQW5vamEgUGVyZXJhLCBhbmQgQy4gUm9uIFl1LiAgICAKClRoZSBwYXBlciBjYW4gYmUgZm91bmQgaGVyZTogIAoKW01vbGVjdWxhciwgQ2VsbHVsYXIsIGFuZCBEZXZlbG9wbWVudGFsIE9yZ2FuaXphdGlvbiBvZiB0aGUgTW91c2UgVm9tZXJvbmFzYWwgb3JnYW4gYXQgU2luZ2xlIENlbGwgUmVzb2x1dGlvbl0oaHR0cHM6Ly9lbGlmZXNjaWVuY2VzLm9yZy9yZXZpZXdlZC1wcmVwcmludHMvOTczNTYjdGFiLWNvbnRlbnQpCgoqKiogIAoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CgojIFItTWFya2Rvd24gR2xvYmFsIFNldHRpbmdzICAKCiMgU2V0LXVwIGEgZGVmYXVsdCBpbWFnZSBzaXplIG9mIDEwIFggMTAgaW5jaGVzLiBTdXBwcmVzcyB3YXJuaW5nCiMgYW5kIGVycm9yIG1lc3NhZ2VzLiBIaWRlIGNvZGUuCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBjb21tZW50PSIiLAogICAgICAgICAgICAgICAgICAgICAgZXJyb3I9RkFMU0UsIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMiwgY2FjaGU9RkFMU0UpCgpgYGAKCmBgYHtyIGxpYnJhcmllcywgaW5jbHVkZT1GQUxTRX0KCiMgTGlicmFyeSBMb2FkaW5nICAKCnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyh7CiAgbGlicmFyeShraXQpOyBsaWJyYXJ5KHRpZHl2ZXJzZSk7IGxpYnJhcnkoc3RyaW5ncik7IGxpYnJhcnkocGxvdDNEKSAKICBsaWJyYXJ5KGdncGxvdDIpOyBsaWJyYXJ5KGRhdGEudGFibGUpOyBsaWJyYXJ5KG9yZy5NbS5lZy5kYikKICBsaWJyYXJ5KGRwbHlyKTsgbGlicmFyeShTZXVyYXQpOyBsaWJyYXJ5KERCSSk7IGxpYnJhcnkoY293cGxvdCkKICBsaWJyYXJ5KE1hdHJpeCk7IGxpYnJhcnkoZ2xtR2FtUG9pKTsgbGlicmFyeShjaXJjbGl6ZSkKICBsaWJyYXJ5KHRpYmJsZSk7IGxpYnJhcnkoZ2dwdWJyKTsgbGlicmFyeShzdmdsaXRlKTsgbGlicmFyeShnZ3NpZ25pZikKICBsaWJyYXJ5KHN0YXRzKTsgbGlicmFyeSh2ZWdhbik7IGxpYnJhcnkoc2NhbGVzKTsgbGlicmFyeShjYXJldCkKICBsaWJyYXJ5KHBhdGNod29yayk7IGxpYnJhcnkocGxvdGx5KTsgbGlicmFyeShnZW9tdGV4dHBhdGgpCiAgbGlicmFyeShvcGVueGxzeCk7IGxpYnJhcnkoZ3JpZEV4dHJhKTsgbGlicmFyeShnZ3JlcGVsKQogIGxpYnJhcnkoR2VuZU92ZXJsYXApOyBsaWJyYXJ5KGJpb21hUnQpOyBsaWJyYXJ5KGdncG9pbnRkZW5zaXR5KQogIGxpYnJhcnkoc2xpbmdzaG90KTsgbGlicmFyeSh0cmFkZVNlcSk7IGxpYnJhcnkoU2luZ2xlQ2VsbEV4cGVyaW1lbnQpCiAgbGlicmFyeSh2aXJpZGlzKTsgbGlicmFyeShVcFNldFIpOyBsaWJyYXJ5KHBoZWF0bWFwKTsgbGlicmFyeShtc2lnZGJyKQogIGxpYnJhcnkoZmdzZWEpOyBsaWJyYXJ5KGdyaWQpOyBsaWJyYXJ5KElEUG1pc2MpOyBsaWJyYXJ5KE1BU1MpCiAgbGlicmFyeShSbWlzYyk7IGxpYnJhcnkoZ2dwbG90aWZ5KTsgbGlicmFyeShnZ3BtaXNjKTsgbGlicmFyeShzY2FsZXMpCiAgbGlicmFyeShoZWF0bWFwbHkpOyBsaWJyYXJ5KGRlbmRleHRlbmQpCn0pCgpgYGAKCmBgYHtyfQoKIyBHbG9iYWwgVmFyaWFibGVzCgojIFRoZSBob21lIGRpcmVjdG9yeQpob21lX2RpciA8LSAiL2wvWXUvWXVMYWIvQmlvaW5mb3JtYXRpY3MvcHJvamVjdHMvbWhoL3NjX1ZOTy8iCiMgRGlyZWN0b3J5IGZvciBzdG9yaW5nIGRhdGEgb2JqZWN0cyBhdCBjcnVjaWFsIHN0YWdlcwpvYmplY3RfZGlyIDwtIHBhc3RlMChob21lX2RpciwiZmluYWwuc2V1Lm9ianMvIikKIyBEaXJlY3RvcnkgZm9yIGltYWdlcyBmcm9tIHRoZSBmaW5hbCBhbmFseXNpcwppbWFnZV9kaXIgPC0gcGFzdGUwKGhvbWVfZGlyLCJmaW5hbF9pbWFnZXMvIikKYWRvYmVfaW1hZ2VzIDwtIHBhc3RlMChpbWFnZV9kaXIsICJhZG9iZV9pbGx1c3RyYXRvcl9zdmdfZmlsZXMvIikKIyBEaXJlY3RvcnkgZm9yIGltYWdlcyBmb3IgdGhlIGZpbmFsIHBhcGVyCmNsdXN0cmVlX2RpciA8LSBwYXN0ZTAoaW1hZ2VfZGlyLCJjbHVzdHJlZS8iKQojIEEgZGlyZWN0b3J5IGZvciBUcmFkZVNlcSBmaXRHQU0gb3V0cHV0CmZpdEdBTV9kaXIgPC0gcGFzdGUwKG9iamVjdF9kaXIsICJmaXRHQU0vIikKbW9lX2RpciA8LSAiL2wvWXUvWXVMYWIvQmlvaW5mb3JtYXRpY3MvcHJvamVjdHMvbWhoL21vbG5nXzI0MDdfMjQ1My9SX29iai8iCgojIE9QRU4gYGBgdm5vLnNldS5pbnRlZ3JhdGVkYGBgCmxvYWQoZmlsZSA9IHBhc3RlMChvYmplY3RfZGlyLCJ2bm8uaW50ZWdyYXRlZC5wb3N0Q2VsbElEIikpCiNMb2FkIE5ldXJvbmFsIExpbmVhZ2UgU2V1cmF0IE9iamVjdCAgCmxvYWQoZmlsZSA9IHBhc3RlMChvYmplY3RfZGlyLCJuZXVyb24uaW50ZWdyYXRlZC5wb3N0Q2VsbElEIikpCgojIFJlbmFtZSB1bmtub3duX21WU04gdG8gc1ZTTgpsZXZlbHModm5vLnNldS5pbnRlZ3JhdGVkQGFjdGl2ZS5pZGVudClbbGV2ZWxzKHZuby5zZXUuaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpPT0idW5rbm93bl9tVlNOIl0gPC0gInNWU04iCmxldmVscyhuZXVyb24uaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpW2xldmVscyhuZXVyb24uaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpPT0idW5rbm93bl9tVlNOIl0gPC0gInNWU04iCmxldmVscyh2bm8uc2V1LmludGVncmF0ZWQkY2VsbF90eXBlKVtsZXZlbHModm5vLnNldS5pbnRlZ3JhdGVkJGNlbGxfdHlwZSk9PSJ1bmtub3duX21WU04iXSA8LSAic1ZTTiIKbGV2ZWxzKG5ldXJvbi5pbnRlZ3JhdGVkJGNlbGxfdHlwZSlbbGV2ZWxzKG5ldXJvbi5pbnRlZ3JhdGVkJGNlbGxfdHlwZSk9PSJ1bmtub3duX21WU04iXSA8LSAic1ZTTiIKCiMgR2V0IGNvbG9yIHNjaGVtZSBmb3IgdGhlIHdob2xlIHZubyBkYXRhc2V0CnZuby5jZWxsX3R5cGUuY29sb3JzIDwtIGh1ZV9wYWwoKShsZW5ndGgobGV2ZWxzKHZuby5zZXUuaW50ZWdyYXRlZEBhY3RpdmUuaWRlbnQpKSkKbmFtZXModm5vLmNlbGxfdHlwZS5jb2xvcnMpIDwtIGxldmVscyh2bm8uc2V1LmludGVncmF0ZWRAYWN0aXZlLmlkZW50KQoKIyBLZWVwIG5ldXJvbiBkYXRhc2V0IGNvbG9yIHNjaGVtZSBjb25zaXN0ZW50IHdpdGggdGhlIHdob2xlIHZubyBjb2xvciBzY2hlbWUsIHdoZXJlIHBvc3NpYmxlICAKbmV1cm9uLmNlbGxfdHlwZS5jb2xvcnMgPC0gdm5vLmNlbGxfdHlwZS5jb2xvcnNbYygiVjFSX21WU04iLCJWMlJfbVZTTiIsIm1PU04iLCJzVlNOIiwiVjFSX2lWU04iLCJWMlJfaVZTTiIsIkdCQyIpXQpuZXVyb24uY2VsbF90eXBlLmNvbG9ycyA8LSBzZXROYW1lcyhjKG5ldXJvbi5jZWxsX3R5cGUuY29sb3JzLCIjMDBCMEY2IiwiIzk1OTBGRiIsIiNFNzZCRjMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyhuYW1lcyhuZXVyb24uY2VsbF90eXBlLmNvbG9ycyksImlPU04iLCJsYXRlX0lOUCIsImVhcmx5X0lOUCIpKQoKbWF0dXJlLm5ldXJvbnMgPC0gc3Vic2V0KG5ldXJvbi5pbnRlZ3JhdGVkLGlkZW50cz1jKCJWMVJfbVZTTiIsIlYyUl9tVlNOIiwibU9TTiIsInNWU04iKSkKbWF0dXJlLmNlbGxfdHlwZS5jb2xvcnMgPC0gbmV1cm9uLmNlbGxfdHlwZS5jb2xvcnNbYygiVjFSX21WU04iLCJWMlJfbVZTTiIsIm1PU04iLCJzVlNOIildCgpnbG9iYWwudmFycyA8LSBjKGxzKCksImdsb2JhbC52YXJzIikKCmBgYAoKKioqICAKCiMgQ28tZXhwcmVzc2lvbiBvZiBjaGVtb3NlbnNvcnkgcmVjZXB0b3JzIHsudGFic2V0IC50YWJzZXQtcGlsbHN9ICAKCiMjIFNoYW5ub24gSW5kaWNlcyBzaG93aW5nIHRoZSBzcGVjaWZpY2l0eSBvZiByZWNlcHRvciBleHByZXNzaW9uLiBIaWdoIHZhbHVlcyBpbmRpY2F0ZSBtb3JlIGNvLWV4cHJlc3Npb24gIAoKYGBge3J9CgphbHBoYS5kaXZlcnNpdHkuZGYgPC0gRmV0Y2hEYXRhKG5ldXJvbi5pbnRlZ3JhdGVkLHZhcnM9YygiYWdlIiwiY2VsbF90eXBlIiwiU2hhbm5vbi5JbmRleCIpKQoKYGBgCgpgYGB7cn0KCmZpZzVfYSA8LSBnZ3Bsb3QoYWxwaGEuZGl2ZXJzaXR5LmRmLGFlcyh4PWNlbGxfdHlwZSx5PVNoYW5ub24uSW5kZXgsZmlsbD1jZWxsX3R5cGUpKSArIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX21hbnVhbCgiQ2VsbCBUeXBlIix2YWx1ZXM9bmV1cm9uLmNlbGxfdHlwZS5jb2xvcnMpICsgI3RoZW1lX2NsYXNzaWMoKSArIAogIHN0YXRfc3VtbWFyeShmdW4ueT1tZWFuLGdlb209J3BvaW50JyxzaXplPTEwLGNvbG91cj0id2hpdGUiLHNoYXBlPTk1LHNob3dfZ3VpZGU9RkFMU0UpICsKICBmYWNldF9ncmlkKC4gfiBhZ2UpICsKICAjIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucz1hbHBoYV9jb21wYXJpc29ucy5saXN0LHRpcC5sZW5ndGg9MC4wMSwKICAjICAgICAgICAgICAgICAgICAgICBtZXRob2Q9IndpbGNveC50ZXN0IixsYWJlbD0icC5zaWduaWYiLHZqdXN0PTAuMykgKwogIHlsYWIoIlNoYW5ub24gSW5kZXgiKSArIHhsYWIoIkNlbGwgVHlwZSIpICsgdGhlbWVfYncoKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvPTIsIHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MzIsZmFjZT0iYm9sZCIpLAogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT00NSx2anVzdD0xLGhqdXN0PTEpLAogICAgICAgIGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0yMCksIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MjQpLCBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjQpKSArIAogIE5vTGVnZW5kKCkgCgpmaWc1X2EKCmBgYAoKIyMgUHJldmFsZW5jZSBhbmQgbGV2ZWwgb2YgcmVjZXB0b3IgY28tZXhwcmVzc2lvbiBieSBhZ2UgYW5kIGNlbGwtdHlwZSBmb3IgdGhlIFYxUiBhbmQgVjJSIGxpbmVhZ2VzLCByZXNwZWN0aXZlbHkgey50YWJzZXQgLnRhYnNldC1waWxsc30gIAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CgpyZWNlcHRvci5tZXRhZGF0YSA8LSBGZXRjaERhdGEobmV1cm9uLmludGVncmF0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJzPWMoImNlbGxfdHlwZSIsImFnZSIsImZpcnN0LnJlY2VwdG9yLmNvdW50IiwicmVjZXB0b3Iuc3BlY2llcyIpKQoKYGBgCgpgYGB7cn0KClYxUi5yZWNlcHRvci5tZXRhZGF0YSA8LSByZWNlcHRvci5tZXRhZGF0YVtyZWNlcHRvci5tZXRhZGF0YSRjZWxsX3R5cGUgJWluJSBjKCJsYXRlX0lOUCIsIlYxUl9pVlNOIiwiVjFSX21WU04iKSwgXQoKYGBgCgpgYGB7cixpbmNsdWRlPUZBTFNFfQoKIyMjIyMgVjFSICMjIyMjCiMgR3JvdXAgZGF0YSBieSBhZ2UvY2VsbF90eXBlIGNvbWJpbmF0aW9ucywgYW5kIGhvdyBtYW55IE4gY2VsbHMgClYxUi5jb19leHAuY2VsbF90eXBlIDwtIAogICBzdW1tYXJ5U0UoVjFSLnJlY2VwdG9yLm1ldGFkYXRhLCAKICAgICAgICAgICAgIG1lYXN1cmV2YXIgPSAiZmlyc3QucmVjZXB0b3IuY291bnQiLCAKICAgICAgICAgICAgIGdyb3VwdmFycyA9IGMoImFnZSIsImNlbGxfdHlwZSIpKQoKVjFSLmNvX2V4cC5jZWxsX3R5cGUkTm9uZSA8LSB1bmxpc3QobGFwcGx5KHJvd25hbWVzKFYxUi5jb19leHAuY2VsbF90eXBlKSwgZnVuY3Rpb24oaSl7CiAgIGFnZSA8LSBWMVIuY29fZXhwLmNlbGxfdHlwZVtpLCAiYWdlIl0KICAgY2VsbF90eXBlIDwtIFYxUi5jb19leHAuY2VsbF90eXBlW2ksICJjZWxsX3R5cGUiXQogICBucm93KFYxUi5yZWNlcHRvci5tZXRhZGF0YVtWMVIucmVjZXB0b3IubWV0YWRhdGEkYWdlID09IGFnZSAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFSLnJlY2VwdG9yLm1ldGFkYXRhJGNlbGxfdHlwZSA9PSBjZWxsX3R5cGUgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFSLnJlY2VwdG9yLm1ldGFkYXRhJHJlY2VwdG9yLnNwZWNpZXMgPT0gMCwgXSkvVjFSLmNvX2V4cC5jZWxsX3R5cGVbaSwgIk4iXQp9KSkKClYxUi5jb19leHAuY2VsbF90eXBlJE9uZSA8LSB1bmxpc3QobGFwcGx5KHJvd25hbWVzKFYxUi5jb19leHAuY2VsbF90eXBlKSwgZnVuY3Rpb24oaSl7CiAgIGFnZSA8LSBWMVIuY29fZXhwLmNlbGxfdHlwZVtpLCAiYWdlIl0KICAgY2VsbF90eXBlIDwtIFYxUi5jb19leHAuY2VsbF90eXBlW2ksICJjZWxsX3R5cGUiXQogICBucm93KFYxUi5yZWNlcHRvci5tZXRhZGF0YVtWMVIucmVjZXB0b3IubWV0YWRhdGEkYWdlID09IGFnZSAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFSLnJlY2VwdG9yLm1ldGFkYXRhJGNlbGxfdHlwZSA9PSBjZWxsX3R5cGUgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFSLnJlY2VwdG9yLm1ldGFkYXRhJHJlY2VwdG9yLnNwZWNpZXMgPT0gMSwgXSkvVjFSLmNvX2V4cC5jZWxsX3R5cGVbaSwgIk4iXQp9KSkKClYxUi5jb19leHAuY2VsbF90eXBlJFR3byA8LSB1bmxpc3QobGFwcGx5KHJvd25hbWVzKFYxUi5jb19leHAuY2VsbF90eXBlKSwgZnVuY3Rpb24oaSl7CiAgIGFnZSA8LSBWMVIuY29fZXhwLmNlbGxfdHlwZVtpLCAiYWdlIl0KICAgY2VsbF90eXBlIDwtIFYxUi5jb19leHAuY2VsbF90eXBlW2ksICJjZWxsX3R5cGUiXQogICBucm93KFYxUi5yZWNlcHRvci5tZXRhZGF0YVtWMVIucmVjZXB0b3IubWV0YWRhdGEkYWdlID09IGFnZSAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFSLnJlY2VwdG9yLm1ldGFkYXRhJGNlbGxfdHlwZSA9PSBjZWxsX3R5cGUgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFSLnJlY2VwdG9yLm1ldGFkYXRhJHJlY2VwdG9yLnNwZWNpZXMgPT0gMiwgXSkvVjFSLmNvX2V4cC5jZWxsX3R5cGVbaSwgIk4iXQp9KSkKClYxUi5jb19leHAuY2VsbF90eXBlJFRocmVlX29yX21vcmUgPC0gdW5saXN0KGxhcHBseShyb3duYW1lcyhWMVIuY29fZXhwLmNlbGxfdHlwZSksIGZ1bmN0aW9uKGkpewogICBhZ2UgPC0gVjFSLmNvX2V4cC5jZWxsX3R5cGVbaSwgImFnZSJdCiAgIGNlbGxfdHlwZSA8LSBWMVIuY29fZXhwLmNlbGxfdHlwZVtpLCAiY2VsbF90eXBlIl0KICAgbnJvdyhWMVIucmVjZXB0b3IubWV0YWRhdGFbVjFSLnJlY2VwdG9yLm1ldGFkYXRhJGFnZSA9PSBhZ2UgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYxUi5yZWNlcHRvci5tZXRhZGF0YSRjZWxsX3R5cGUgPT0gY2VsbF90eXBlICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYxUi5yZWNlcHRvci5tZXRhZGF0YSRyZWNlcHRvci5zcGVjaWVzID49IDMsIF0pL1YxUi5jb19leHAuY2VsbF90eXBlW2ksICJOIl0KfSkpCgpgYGAKCmBgYHtyLGluY2x1ZGU9RkFMU0V9CgpWMVIucGxvdC5kZiA8LSBWMVIuY29fZXhwLmNlbGxfdHlwZSAlPiUgZ2F0aGVyKFJlY2VwdG9ycywgUmF0aW8sIGMoIlRocmVlX29yX21vcmUiLCJUd28iLCJPbmUiLCJOb25lIikpCgpgYGAKCmBgYHtyLGluY2x1ZGU9RkFMU0V9CgojIyBPcmRlciB0aGUgZmFjdG9ycyBhbmQgcm91bmQgdGhlIGZsb2F0cyBpbiB0aGUgREYgIAojIyMjIyBWMVIgIyMjIyMKIyBPcmRlciB0aGUgUmVjZXB0b3JzIGZhY3RvciBsZXZlbHMgZm9yIHBsb3R0aW5nClYxUi5wbG90LmRmJFJlY2VwdG9ycyA8LQogIGZhY3Rvcihhcy5mYWN0b3IoVjFSLnBsb3QuZGYkUmVjZXB0b3JzKSwgCiAgICAgICAgIGxldmVscyA9IGMoIlRocmVlX29yX21vcmUiLCJUd28iLCJPbmUiLCJOb25lIikpCgojIE9yZGVyIHRoZSBhZ2UgZmFjdG9yIGxldmVscyBmb3IgcGxvdHRpbmcKVjFSLnBsb3QuZGYkYWdlIDwtCiAgZmFjdG9yKGFzLmZhY3RvcihWMVIucGxvdC5kZiRhZ2UpLCAKICAgICAgICAgbGV2ZWxzID0gYygiUDE0IiwiUDU2IikpCgojIE9yZGVyIHRoZSBjZWxsX3R5cGUgZmFjdG9yIGxldmVscyBmb3IgcGxvdHRpbmcKVjFSLnBsb3QuZGYkY2VsbF90eXBlIDwtCiAgZmFjdG9yKGFzLmZhY3RvcihWMVIucGxvdC5kZiRjZWxsX3R5cGUpLCAKICAgICAgICAgbGV2ZWxzID0gYygibGF0ZV9JTlAiLCJWMVJfaVZTTiIsIlYxUl9tVlNOIikpCgojIFJvdW5kIHRoZSByYXRpbyB0byA0IGRpZ2l0cwpWMVIucGxvdC5kZiRSYXRpbyA8LSByb3VuZChWMVIucGxvdC5kZiRSYXRpbywgZGlnaXRzID0gNCkKCmBgYAoKIyMjIFYxUiAgCgpgYGB7cn0KCmZpZzVfYiA8LSBnZ3Bsb3QoVjFSLnBsb3QuZGYsIGFlcyh4ID0gYWdlLCB5ID0gUmF0aW8sIGZpbGwgPSBSZWNlcHRvcnMsIGxhYmVsID0gUmF0aW8pKSArIAogIGdlb21fY29sKCkgKyB0aGVtZShhc3BlY3QucmF0aW89Myx0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTI0KSxsZWdlbmQucG9zaXRpb249InRvcCIpICsKICBmYWNldF9ncmlkKC4gfiBjZWxsX3R5cGUpICsKICBnZW9tX3RleHQoZGF0YSA9IHN1YnNldChWMVIucGxvdC5kZiwgUmF0aW8gPiAwKSwgc2l6ZT01LCBwb3NpdGlvbj1wb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSkpICsKICBnZW9tX3RleHQoZGF0YSA9IHN1YnNldChWMVIucGxvdC5kZiwgUmVjZXB0b3JzID09ICJOb25lIiksIHNpemU9NSwgYWVzKHg9YWdlLCB5PS0wLjAxLCBsYWJlbD1wYXN0ZTAoIk49IixOKSkpCgpmaWc1X2IKCmBgYAoKYGBge3J9CgpWMlIucmVjZXB0b3IubWV0YWRhdGEgPC0gcmVjZXB0b3IubWV0YWRhdGFbcmVjZXB0b3IubWV0YWRhdGEkY2VsbF90eXBlICVpbiUgYygibGF0ZV9JTlAiLCJWMlJfaVZTTiIsIlYyUl9tVlNOIiksIF0KCmBgYAoKYGBge3J9CgojIyMjIyBWMlIgIyMjIyMKClYyUi5jb19leHAuY2VsbF90eXBlIDwtIAogICBzdW1tYXJ5U0UoVjJSLnJlY2VwdG9yLm1ldGFkYXRhLCAKICAgICAgICAgICAgIG1lYXN1cmV2YXIgPSAiZmlyc3QucmVjZXB0b3IuY291bnQiLCAKICAgICAgICAgICAgIGdyb3VwdmFycyA9IGMoImFnZSIsImNlbGxfdHlwZSIpKQoKVjJSLmNvX2V4cC5jZWxsX3R5cGUkTm9uZSA8LSB1bmxpc3QobGFwcGx5KHJvd25hbWVzKFYyUi5jb19leHAuY2VsbF90eXBlKSwgZnVuY3Rpb24oaSl7CiAgIGFnZSA8LSBWMlIuY29fZXhwLmNlbGxfdHlwZVtpLCAiYWdlIl0KICAgY2VsbF90eXBlIDwtIFYyUi5jb19leHAuY2VsbF90eXBlW2ksICJjZWxsX3R5cGUiXQogICBucm93KFYyUi5yZWNlcHRvci5tZXRhZGF0YVtWMlIucmVjZXB0b3IubWV0YWRhdGEkYWdlID09IGFnZSAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjJSLnJlY2VwdG9yLm1ldGFkYXRhJGNlbGxfdHlwZSA9PSBjZWxsX3R5cGUgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjJSLnJlY2VwdG9yLm1ldGFkYXRhJHJlY2VwdG9yLnNwZWNpZXMgPT0gMCwgXSkvVjJSLmNvX2V4cC5jZWxsX3R5cGVbaSwgIk4iXQp9KSkKClYyUi5jb19leHAuY2VsbF90eXBlJE9uZSA8LSB1bmxpc3QobGFwcGx5KHJvd25hbWVzKFYyUi5jb19leHAuY2VsbF90eXBlKSwgZnVuY3Rpb24oaSl7CiAgIGFnZSA8LSBWMlIuY29fZXhwLmNlbGxfdHlwZVtpLCAiYWdlIl0KICAgY2VsbF90eXBlIDwtIFYyUi5jb19leHAuY2VsbF90eXBlW2ksICJjZWxsX3R5cGUiXQogICBucm93KFYyUi5yZWNlcHRvci5tZXRhZGF0YVtWMlIucmVjZXB0b3IubWV0YWRhdGEkYWdlID09IGFnZSAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjJSLnJlY2VwdG9yLm1ldGFkYXRhJGNlbGxfdHlwZSA9PSBjZWxsX3R5cGUgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjJSLnJlY2VwdG9yLm1ldGFkYXRhJHJlY2VwdG9yLnNwZWNpZXMgPT0gMSwgXSkvVjJSLmNvX2V4cC5jZWxsX3R5cGVbaSwgIk4iXQp9KSkKClYyUi5jb19leHAuY2VsbF90eXBlJFR3byA8LSB1bmxpc3QobGFwcGx5KHJvd25hbWVzKFYyUi5jb19leHAuY2VsbF90eXBlKSwgZnVuY3Rpb24oaSl7CiAgIGFnZSA8LSBWMlIuY29fZXhwLmNlbGxfdHlwZVtpLCAiYWdlIl0KICAgY2VsbF90eXBlIDwtIFYyUi5jb19leHAuY2VsbF90eXBlW2ksICJjZWxsX3R5cGUiXQogICBucm93KFYyUi5yZWNlcHRvci5tZXRhZGF0YVtWMlIucmVjZXB0b3IubWV0YWRhdGEkYWdlID09IGFnZSAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjJSLnJlY2VwdG9yLm1ldGFkYXRhJGNlbGxfdHlwZSA9PSBjZWxsX3R5cGUgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgVjJSLnJlY2VwdG9yLm1ldGFkYXRhJHJlY2VwdG9yLnNwZWNpZXMgPT0gMiwgXSkvVjJSLmNvX2V4cC5jZWxsX3R5cGVbaSwgIk4iXQp9KSkKClYyUi5jb19leHAuY2VsbF90eXBlJFRocmVlX29yX21vcmUgPC0gdW5saXN0KGxhcHBseShyb3duYW1lcyhWMlIuY29fZXhwLmNlbGxfdHlwZSksIGZ1bmN0aW9uKGkpewogICBhZ2UgPC0gVjJSLmNvX2V4cC5jZWxsX3R5cGVbaSwgImFnZSJdCiAgIGNlbGxfdHlwZSA8LSBWMlIuY29fZXhwLmNlbGxfdHlwZVtpLCAiY2VsbF90eXBlIl0KICAgbnJvdyhWMlIucmVjZXB0b3IubWV0YWRhdGFbVjJSLnJlY2VwdG9yLm1ldGFkYXRhJGFnZSA9PSBhZ2UgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYyUi5yZWNlcHRvci5tZXRhZGF0YSRjZWxsX3R5cGUgPT0gY2VsbF90eXBlICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYyUi5yZWNlcHRvci5tZXRhZGF0YSRyZWNlcHRvci5zcGVjaWVzID49IDMsIF0pL1YyUi5jb19leHAuY2VsbF90eXBlW2ksICJOIl0KfSkpCgpgYGAKCmBgYHtyfQoKVjJSLnBsb3QuZGYgPC0gVjJSLmNvX2V4cC5jZWxsX3R5cGUgJT4lIGdhdGhlcihSZWNlcHRvcnMsIFJhdGlvLCBjKCJUaHJlZV9vcl9tb3JlIiwiVHdvIiwiT25lIiwiTm9uZSIpKQoKYGBgCgpgYGB7cn0KCiMjIyMjIFYyUiAjIyMjIwoKIyBPcmRlciB0aGUgUmVjZXB0b3JzIGZhY3RvciBsZXZlbHMgZm9yIHBsb3R0aW5nClYyUi5wbG90LmRmJFJlY2VwdG9ycyA8LQogIGZhY3Rvcihhcy5mYWN0b3IoVjJSLnBsb3QuZGYkUmVjZXB0b3JzKSwgCiAgICAgICAgIGxldmVscyA9IGMoIlRocmVlX29yX21vcmUiLCJUd28iLCJPbmUiLCJOb25lIikpCgojIE9yZGVyIHRoZSBhZ2UgZmFjdG9yIGxldmVscyBmb3IgcGxvdHRpbmcKVjJSLnBsb3QuZGYkYWdlIDwtCiAgZmFjdG9yKGFzLmZhY3RvcihWMlIucGxvdC5kZiRhZ2UpLCAKICAgICAgICAgbGV2ZWxzID0gYygiUDE0IiwiUDU2IikpCgojIE9yZGVyIHRoZSBjZWxsX3R5cGUgZmFjdG9yIGxldmVscyBmb3IgcGxvdHRpbmcKVjJSLnBsb3QuZGYkY2VsbF90eXBlIDwtCiAgZmFjdG9yKGFzLmZhY3RvcihWMlIucGxvdC5kZiRjZWxsX3R5cGUpLCAKICAgICAgICAgbGV2ZWxzID0gYygiZWFybHlfSU5QIiwibGF0ZV9JTlAiLCJWMlJfaVZTTiIsIlYyUl9tVlNOIikpCgojIFJvdW5kIHRoZSByYXRpbyB0byA0IGRpZ2l0cwpWMlIucGxvdC5kZiRSYXRpbyA8LSByb3VuZChWMlIucGxvdC5kZiRSYXRpbywgZGlnaXRzID0gNCkKCmBgYAoKIyMjIFYyUiAgCgpgYGB7cn0KCmZpZzVfYyA8LSBnZ3Bsb3QoVjJSLnBsb3QuZGYsIGFlcyh4ID0gYWdlLCB5ID0gUmF0aW8sIGZpbGwgPSBSZWNlcHRvcnMsIGxhYmVsID0gUmF0aW8pKSArCiAgZ2VvbV9jb2woKSArIHRoZW1lKGFzcGVjdC5yYXRpbz0zLHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MjQpLGxlZ2VuZC5wb3NpdGlvbj0idG9wIikgKwogIGZhY2V0X2dyaWQoLiB+IGNlbGxfdHlwZSkgKwogIGdlb21fdGV4dChkYXRhID0gc3Vic2V0KFYyUi5wbG90LmRmLCBSYXRpbyA+IDApLCBzaXplPTUsIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpKSArCiAgZ2VvbV90ZXh0KGRhdGEgPSBzdWJzZXQoVjJSLnBsb3QuZGYsIFJlY2VwdG9ycyA9PSAiTm9uZSIpLCBzaXplPTUsIGFlcyh4PWFnZSwgeT0tMC4wMSwgbGFiZWw9cGFzdGUwKCJOPSIsTikpKQoKZmlnNV9jCgpgYGAKCiMjIENpcmNvcyBwbG90IG9mIGdlbm9taWMgbG9jaSBmb3Igc2lnbmlmaWNhbnRseSBjby1leHByZXNzZWQgcmVjZXB0b3IgcGFpcnMgaW4gdGhlIFYxUiwgVjJSLCBhbmQgYWNyb3NzLXR5cGUgcG9wdWxhdGlvbnMgey50YWJzZXQgLnRhYnNldC1waWxsc30gIAoKYGBge3J9Cgpsb2FkKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsICJzaWcudjFyLmNvZXhwcmVzcyIpKQpsb2FkKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsICJ2MXIuY2lyY29zLmJlZCIpKQpsb2FkKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsICJ2MXIuYmVkMSIpKQpsb2FkKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsICJ2MXIuYmVkMiIpKQpsb2FkKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsICJzaWcudjJyLmNvZXhwcmVzcyIpKQpsb2FkKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsICJ2MnIuY2lyY29zLmJlZCIpKQpsb2FkKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsICJ2MnIuYmVkMSIpKQpsb2FkKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsICJ2MnIuYmVkMiIpKQpsb2FkKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsICJzaWcuaW50ZXJjbGFzcy5jb2V4cHJlc3MiKSkKbG9hZChmaWxlPXBhc3RlMChvYmplY3RfZGlyLCAiaW50ZXJjbGFzcy5jaXJjb3MuYmVkIikpCmxvYWQoZmlsZT1wYXN0ZTAob2JqZWN0X2RpciwgImludGVyY2xhc3MuYmVkMSIpKQpsb2FkKGZpbGU9cGFzdGUwKG9iamVjdF9kaXIsICJpbnRlcmNsYXNzLmJlZDIiKSkKCmBgYAoKYGBge3J9Cgp2MXIuc2VjdG9ycyA8LSBsYXBwbHkodW5pcXVlKHYxci5jaXJjb3MuYmVkJGNociksIGZ1bmN0aW9uKGNocil7CiAgcGFkZGluZyA8LSAxMDAwMDAKICBzZWN0b3Iuc3RhcnQgPC0gbWluKHYxci5jaXJjb3MuYmVkW3Yxci5jaXJjb3MuYmVkJGNociA9PSBjaHIsICJzdGFydCJdKSAtIHBhZGRpbmcKICBzZWN0b3IuZW5kIDwtIG1heCh2MXIuY2lyY29zLmJlZFt2MXIuY2lyY29zLmJlZCRjaHIgPT0gY2hyLCAiZW5kIl0pICsgcGFkZGluZwogIHJldHVybihjKGNocixzZWN0b3Iuc3RhcnQsc2VjdG9yLmVuZCkpCn0pCgp2MXIuY2hyLmNvb3JkIDwtIGFzLmRhdGEuZnJhbWUoZG8uY2FsbChyYmluZCwgdjFyLnNlY3RvcnMpKQpjb2xuYW1lcyh2MXIuY2hyLmNvb3JkKSA8LSBjKCJjaHIiLCJzdGFydCIsImVuZCIpCgptYWpvci50aXggPC0gc2VxKGZyb209MCx0bz0yNTAwMDAwMDAsYnk9MTAwMDAwKQoKYGBgCgojIyMgVjFSIENvLWV4cHJlc3Npb24gIAoKYGBge3IsIGZpZy53aWR0aD00MCxmaWcuaGVpZ2h0PTQwfQoKZm9udC5zY2FsZSA8LSA3CgpjaXJjb3MucGFyKHN0YXJ0LmRlZ3JlZT05MCwgZ2FwLmRlZ3JlZT0yLCB0cmFjay5tYXJnaW49YygwLjAwMDUsMC4wMDA1KSkKY2lyY29zLmdlbm9taWNJbml0aWFsaXplKHYxci5jaHIuY29vcmQscGxvdFR5cGUgPSBOVUxMKQojIEFkZCB0aGUgZ2VuZVN5bWJvbCBsYWJlbHMKY2lyY29zLmdlbm9taWNMYWJlbHModjFyLmNpcmNvcy5iZWQsIGxhYmVscy5jb2x1bW49NCwgc2lkZT0ib3V0c2lkZSIsIGxhYmVsc19oZWlnaHQ9MC4yOSwgY2V4PWZvbnQuc2NhbGUsCiAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc9MC4wNCwgY29ubmVjdGlvbl9oZWlnaHQ9bW1faCgxNSksIGxpbmVfbHdkPTUpCgojIERyYXcgdGhlIHNlY3RvcnMgYW5kIGFkZCBjaHIgSUQgYXMgdGV4dApjaXJjb3MudHJhY2soeWxpbT1jKDAsMSksIHBhbmVsLmZ1bj1mdW5jdGlvbih4LHkpewogIGNocj1DRUxMX01FVEEkc2VjdG9yLmluZGV4CiAgeGxpbT1DRUxMX01FVEEkeGxpbQogIHlsaW09Q0VMTF9NRVRBJHlsaW0KICBjaXJjb3MucmVjdCh4bGltWzFdLCAwLCB4bGltWzJdLCAxLCBjb2w9ImRhcmtyZWQiKQogIGNpcmNvcy50ZXh0KG1lYW4oeGxpbSksIG1lYW4oeWxpbSksIGNociwgY2V4PWZvbnQuc2NhbGUsIGNvbD0id2hpdGUiLCBmYWNpbmc9ImNsb2Nrd2lzZSIsIG5pY2VGYWNpbmc9VFJVRSkKICBjaXJjb3MueGF4aXMoaD0xLCBsYWJlbHM9RkFMU0UsIGRpcmVjdGlvbj0ib3V0c2lkZSIsIG1pbm9yLnRpY2tzPTEsCiAgICAgICAgICAgICAgIG1ham9yLnRpY2subGVuZ3RoPTAuMDUsIG1ham9yLmF0PW1ham9yLnRpeCwgbHdkPTUpCiAgfSwgdHJhY2suaGVpZ2h0PTAuMjIsIGJnLmJvcmRlcj1OQSkKY2lyY29zLmdlbm9taWNMaW5rKHYxci5iZWQxLCB2MXIuYmVkMiwgY29sPXNpZy52MXIuY29leHByZXNzJGNvbG9yLCBsd2Q9NSwgYm9yZGVyPU5BKQoKYGBgCgpgYGB7cn0KCnYyci5zZWN0b3JzIDwtIGxhcHBseSh1bmlxdWUodjJyLmNpcmNvcy5iZWQkY2hyKSwgZnVuY3Rpb24oY2hyKXsKICBwYWRkaW5nIDwtIDEwMDAwMAogIHNlY3Rvci5zdGFydCA8LSBtaW4odjJyLmNpcmNvcy5iZWRbdjJyLmNpcmNvcy5iZWQkY2hyID09IGNociwgInN0YXJ0Il0pIC0gcGFkZGluZwogIHNlY3Rvci5lbmQgPC0gbWF4KHYyci5jaXJjb3MuYmVkW3Yyci5jaXJjb3MuYmVkJGNociA9PSBjaHIsICJlbmQiXSkgKyBwYWRkaW5nCiAgcmV0dXJuKGMoY2hyLHNlY3Rvci5zdGFydCxzZWN0b3IuZW5kKSkKfSkKCnYyci5jaHIuY29vcmQgPC0gYXMuZGF0YS5mcmFtZShkby5jYWxsKHJiaW5kLCB2MnIuc2VjdG9ycykpCmNvbG5hbWVzKHYyci5jaHIuY29vcmQpIDwtIGMoImNociIsInN0YXJ0IiwiZW5kIikKCmNvbHMubnVtIDwtIGMoInN0YXJ0IiwiZW5kIikKdjJyLmNoci5jb29yZFtjb2xzLm51bV0gPC0gc2FwcGx5KHYyci5jaHIuY29vcmRbY29scy5udW1dLGFzLm51bWVyaWMpCgpgYGAKCiMjIyBWMlIgQ28tZXhwcmVzc2lvbiAgCgpgYGB7ciwgZmlnLndpZHRoPTUwLGZpZy5oZWlnaHQ9NTB9Cgpmb250LnNjYWxlIDwtIDcKCmNpcmNvcy5wYXIoc3RhcnQuZGVncmVlPTkwLCBnYXAuZGVncmVlPTIsIHRyYWNrLm1hcmdpbj1jKDAuMDAwNSwwLjAwMDUpKQpjaXJjb3MuZ2Vub21pY0luaXRpYWxpemUodjJyLmNoci5jb29yZCxwbG90VHlwZSA9IE5VTEwpCiMgQWRkIHRoZSBnZW5lU3ltYm9sIGxhYmVscwpjaXJjb3MuZ2Vub21pY0xhYmVscyh2MnIuY2lyY29zLmJlZCwgbGFiZWxzLmNvbHVtbj00LCBzaWRlPSJvdXRzaWRlIiwgbGFiZWxzX2hlaWdodD0wLjI5LCBjZXg9Zm9udC5zY2FsZSwKICAgICAgICAgICAgICAgICAgICAgcGFkZGluZz0wLjA0LCBjb25uZWN0aW9uX2hlaWdodD1tbV9oKDE1KSwgbGluZV9sd2Q9NSkKCiMgRHJhdyB0aGUgc2VjdG9ycyBhbmQgYWRkIGNociBJRCBhcyB0ZXh0CmNpcmNvcy50cmFjayh5bGltPWMoMCwxKSwgcGFuZWwuZnVuPWZ1bmN0aW9uKHgseSl7CiAgY2hyPUNFTExfTUVUQSRzZWN0b3IuaW5kZXgKICB4bGltPUNFTExfTUVUQSR4bGltCiAgeWxpbT1DRUxMX01FVEEkeWxpbQogIGNpcmNvcy5yZWN0KHhsaW1bMV0sIDAsIHhsaW1bMl0sIDEsIGNvbD0iZGFya2JsdWUiKQogIGNpcmNvcy50ZXh0KG1lYW4oeGxpbSksIG1lYW4oeWxpbSksIGNociwgY2V4PWZvbnQuc2NhbGUsIGNvbD0id2hpdGUiLCBmYWNpbmc9ImNsb2Nrd2lzZSIsIG5pY2VGYWNpbmc9VFJVRSkKICBjaXJjb3MueGF4aXMoaD0xLCBsYWJlbHM9RkFMU0UsIGRpcmVjdGlvbj0ib3V0c2lkZSIsIG1pbm9yLnRpY2tzPTEsCiAgICAgICAgICAgICAgIG1ham9yLnRpY2subGVuZ3RoPTAuMDUsIG1ham9yLmF0PW1ham9yLnRpeCwgbHdkPTUpCiAgfSwgdHJhY2suaGVpZ2h0PTAuMjIsIGJnLmJvcmRlcj1OQSkKY2lyY29zLmdlbm9taWNMaW5rKHYyci5iZWQxLCB2MnIuYmVkMiwgY29sPXNpZy52MnIuY29leHByZXNzJGNvbG9yLCBsd2Q9NSwgYm9yZGVyPU5BKQoKYGBgCgojIyMgSW50ZXJjbGFzcyBDby1leHByZXNzaW9uICAKCmBgYHtyfQoKaW50ZXJjbGFzcy5zZWN0b3JzIDwtIGxhcHBseSh1bmlxdWUoaW50ZXJjbGFzcy5jaXJjb3MuYmVkJGNociksIGZ1bmN0aW9uKGNocil7CiAgcGFkZGluZyA8LSAxMDAwMDAKICBzZWN0b3Iuc3RhcnQgPC0gbWluKGludGVyY2xhc3MuY2lyY29zLmJlZFtpbnRlcmNsYXNzLmNpcmNvcy5iZWQkY2hyID09IGNociwgInN0YXJ0Il0pIC0gcGFkZGluZwogIHNlY3Rvci5lbmQgPC0gbWF4KGludGVyY2xhc3MuY2lyY29zLmJlZFtpbnRlcmNsYXNzLmNpcmNvcy5iZWQkY2hyID09IGNociwgImVuZCJdKSArIHBhZGRpbmcKICByZXR1cm4oYyhjaHIsc2VjdG9yLnN0YXJ0LHNlY3Rvci5lbmQpKQp9KQoKaW50ZXJjbGFzcy5jaHIuY29vcmQgPC0gYXMuZGF0YS5mcmFtZShkby5jYWxsKHJiaW5kLCBpbnRlcmNsYXNzLnNlY3RvcnMpKQpjb2xuYW1lcyhpbnRlcmNsYXNzLmNoci5jb29yZCkgPC0gYygiY2hyIiwic3RhcnQiLCJlbmQiKQoKbWFqb3IudGl4IDwtIHNlcShmcm9tPTAsdG89MjUwMDAwMDAwLGJ5PTEwMDAwMCkKCmBgYAoKYGBge3IsIGZpZy53aWR0aD01MCxmaWcuaGVpZ2h0PTUwfQoKZm9udC5zY2FsZSA8LSA3CgpjaXJjb3MucGFyKHN0YXJ0LmRlZ3JlZT05MCwgZ2FwLmRlZ3JlZT0yLCB0cmFjay5tYXJnaW49YygwLjAwMDUsMC4wMDA1KSkKY2lyY29zLmdlbm9taWNJbml0aWFsaXplKGludGVyY2xhc3MuY2hyLmNvb3JkLHBsb3RUeXBlID0gTlVMTCkKIyBBZGQgdGhlIGdlbmVTeW1ib2wgbGFiZWxzCmNpcmNvcy5nZW5vbWljTGFiZWxzKGludGVyY2xhc3MuY2lyY29zLmJlZCwgbGFiZWxzLmNvbHVtbj00LCBzaWRlPSJvdXRzaWRlIiwgbGFiZWxzX2hlaWdodD0wLjI5LCBjZXg9Zm9udC5zY2FsZSwKICAgICAgICAgICAgICAgICAgICAgcGFkZGluZz0wLjA0LCBjb25uZWN0aW9uX2hlaWdodD1tbV9oKDE1KSwgbGluZV9sd2Q9NSkKCiMgRHJhdyB0aGUgc2VjdG9ycyBhbmQgYWRkIGNociBJRCBhcyB0ZXh0CmNpcmNvcy50cmFjayh5bGltPWMoMCwxKSwgcGFuZWwuZnVuPWZ1bmN0aW9uKHgseSl7CiAgY2hyPUNFTExfTUVUQSRzZWN0b3IuaW5kZXgKICB4bGltPUNFTExfTUVUQSR4bGltCiAgeWxpbT1DRUxMX01FVEEkeWxpbQogIGNpcmNvcy5yZWN0KHhsaW1bMV0sIDAsIHhsaW1bMl0sIDEsIGNvbD0iZGFya2dyZWVuIikKICBjaXJjb3MudGV4dChtZWFuKHhsaW0pLCBtZWFuKHlsaW0pLCBjaHIsIGNleD1mb250LnNjYWxlLCBjb2w9IndoaXRlIiwgZmFjaW5nPSJjbG9ja3dpc2UiLCBuaWNlRmFjaW5nPVRSVUUpCiAgY2lyY29zLnhheGlzKGg9MSwgbGFiZWxzPUZBTFNFLCBkaXJlY3Rpb249Im91dHNpZGUiLCBtaW5vci50aWNrcz0xLAogICAgICAgICAgICAgICBtYWpvci50aWNrLmxlbmd0aD0wLjA1LCBtYWpvci5hdD1tYWpvci50aXgsIGx3ZD01KQogIH0sIHRyYWNrLmhlaWdodD0wLjIyLCBiZy5ib3JkZXI9TkEpCmNpcmNvcy5nZW5vbWljTGluayhpbnRlcmNsYXNzLmJlZDEsIGludGVyY2xhc3MuYmVkMiwgY29sPXNpZy5pbnRlcmNsYXNzLmNvZXhwcmVzcyRjb2xvciwgbHdkPTUsIGJvcmRlcj1OQSkKCmBgYAoK